﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace ShiQuan.Hanker
{
    /// <summary>
    /// 海康.Net SDK
    /// </summary>
    public class HCNetSDK
    {
        /// <summary>
        /// 序列号长度
        /// </summary>
        public const int SERIALNO_LEN = 48;//序列号长度
        /// <summary>
        /// 获取IP接入配置信息
        /// </summary>
        public const int NET_DVR_GET_IPPARACFG_V40 = 1062; //获取IP接入配置信息
        //IP接入配置参数 （NET_DVR_IPPARACFG_V40结构）
        /// <summary>
        /// 设置IP接入配置信息
        /// </summary>
        public const int NET_DVR_SET_IPPARACFG_V40 = 1063;//设置IP接入配置信息
        /// <summary>
        /// 
        /// </summary>
        public const int MAX_CHANNUM_V30 = MAX_ANALOG_CHANNUM + MAX_IP_CHANNEL;//64

        //9000 IPC接入
        /// <summary>
        /// 最大32个模拟通道
        /// </summary>
        public const int MAX_ANALOG_CHANNUM = 32;//最大32个模拟通道
        /// <summary>
        /// 最大32路模拟报警输出
        /// </summary>
        public const int MAX_ANALOG_ALARMOUT = 32; //最大32路模拟报警输出 
        /// <summary>
        /// 最大32路模拟报警输入
        /// </summary>
        public const int MAX_ANALOG_ALARMIN = 32;//最大32路模拟报警输入
        /// <summary>
        /// 允许接入的最大IP设备数
        /// </summary>
        public const int MAX_IP_DEVICE = 32;//允许接入的最大IP设备数
        /// <summary>
        /// 允许接入的最大IP设备数
        /// </summary>
        public const int MAX_IP_DEVICE_V40 = 64;//允许接入的最大IP设备数
        /// <summary>
        /// 允许加入的最多IP通道数
        /// </summary>
        public const int MAX_IP_CHANNEL = 32;//允许加入的最多IP通道数
        /// <summary>
        /// 允许加入的最多报警输入数
        /// </summary>
        public const int MAX_IP_ALARMIN = 128;//允许加入的最多报警输入数
        /// <summary>
        /// 允许加入的最多报警输出数
        /// </summary>
        public const int MAX_IP_ALARMOUT = 64;//允许加入的最多报警输出数
        /// <summary>
        /// 允许加入的最多报警输入数
        /// </summary>
        public const int MAX_IP_ALARMIN_V40 = 4096;    //允许加入的最多报警输入数
        /// <summary>
        /// 允许加入的最多报警输出数
        /// </summary>
        public const int MAX_IP_ALARMOUT_V40 = 4096;    //允许加入的最多报警输出数
        /// <summary>
        /// 每次删除或者刻录的最大文件数
        /// </summary>
        public const int MAX_RECORD_FILE_NUM = 20;      // 每次删除或者刻录的最大文件数

        /* 最大支持的通道数 最大模拟加上最大IP支持 */

        public const int MAX_ALARMOUT_V30 = MAX_ANALOG_ALARMOUT + MAX_IP_ALARMOUT;//96
        public const int MAX_ALARMIN_V30 = MAX_ANALOG_ALARMIN + MAX_IP_ALARMIN;//160
        /// <summary>
        /// 用户名长度
        /// </summary>
        public const int NAME_LEN = 32;//用户名长度
        /// <summary>
        /// 密码长度
        /// </summary>
        public const int PASSWD_LEN = 16;//密码长度
        /// <summary>
        /// GUID长度
        /// </summary>
        public const int GUID_LEN = 16;      //GUID长度
        /// <summary>
        /// 设备类型名称长度
        /// </summary>
        public const int DEV_TYPE_NAME_LEN = 24;      //设备类型名称长度
        /// <summary>
        /// DVR本地登陆名
        /// </summary>
        public const int MAX_NAMELEN = 16;//DVR本地登陆名
        /// <summary>
        /// 设备支持的权限
        /// </summary>
        public const int MAX_RIGHT = 32;//设备支持的权限（1-12表示本地权限，13-32表示远程权限）
        /// <summary>
        /// 最大域名长度
        /// </summary>
        public const int MAX_DOMAIN_NAME = 64;  /* 最大域名长度 */

        public const int STREAM_ID_LEN = 32;
        //设备参数配置 （NET_DVR_DEVICECFG_V40结构）
        public const int NET_DVR_GET_DEVICECFG_V40 = 1100;//获取设备参数
        public const int NET_DVR_SET_DEVICECFG_V40 = 1101;//设置设备参数
        /// <summary>
        /// 设备可配以太网络
        /// </summary>
        public const int MAX_ETHERNET = 2;//设备可配以太网络
        /// <summary>
        /// mac地址长度
        /// </summary>
        public const int MACADDR_LEN = 6;//mac地址长度
        //网络(NET_DVR_NETCFG_V30结构)
        public const int NET_DVR_GET_NETCFG_V30 = 1000;//获取网络参数
        public const int NET_DVR_SET_NETCFG_V30 = 1001;//设置网络参数

        #region 初始化 登录
        /*********************************************************
        Function:	NET_DVR_Init
        Desc:		初始化SDK，调用其他SDK函数的前提。
        Input:	
        Output:	
        Return:	TRUE表示成功，FALSE表示失败。
        **********************************************************/
        /// <summary>
        /// 初始化SDK，调用其他SDK函数的前提。
        /// </summary>
        /// <returns>TRUE表示成功，FALSE表示失败</returns>
        [DllImport(@"HCNetSDK.dll")]
        public static extern bool NET_DVR_Init();

        /// <summary>
        /// 
        /// </summary>
        //NET_DVR_Login_V30()参数结构
        [StructLayoutAttribute(LayoutKind.Sequential)]
        public struct NET_DVR_DEVICEINFO_V30
        {
            /// <summary>
            /// 序列号
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = SERIALNO_LEN, ArraySubType = UnmanagedType.I1)]
            public byte[] sSerialNumber;  //序列号
            /// <summary>
            /// 报警输入个数
            /// </summary>
            public byte byAlarmInPortNum;		        //报警输入个数
            /// <summary>
            /// 报警输出个数
            /// </summary>
            public byte byAlarmOutPortNum;		        //报警输出个数
            /// <summary>
            /// 硬盘个数
            /// </summary>
            public byte byDiskNum;				    //硬盘个数
            /// <summary>
            /// 设备类型
            /// </summary>
            public byte byDVRType;				    //设备类型, 1:DVR 2:ATM DVR 3:DVS ......
            /// <summary>
            /// 模拟通道个数
            /// </summary>
            public byte byChanNum;				    //模拟通道个数
            /// <summary>
            /// 起始通道号
            /// </summary>
            public byte byStartChan;			        //起始通道号,例如DVS-1,DVR - 1
            /// <summary>
            /// 语音通道数
            /// </summary>
            public byte byAudioChanNum;                //语音通道数
            /// <summary>
            /// 最大数字通道个数
            /// </summary>
            public byte byIPChanNum;					//最大数字通道个数，低位  
            /// <summary>
            /// 零通道编码个数
            /// </summary>
            public byte byZeroChanNum;			//零通道编码个数 //2010-01-16
            /// <summary>
            /// 主码流传输协议类型 0-private, 1-rtsp,2-同时支持private和rtsp
            /// </summary>
            public byte byMainProto;			//主码流传输协议类型 0-private, 1-rtsp,2-同时支持private和rtsp
            /// <summary>
            /// 子码流传输协议类型 0-private, 1-rtsp,2-同时支持private和rtsp
            /// </summary>
            public byte bySubProto;				//子码流传输协议类型0-private, 1-rtsp,2-同时支持private和rtsp
            /// <summary>
            /// 能力，位与结果为0表示不支持，1表示支持，
            /// </summary>
            public byte bySupport;        //能力，位与结果为0表示不支持，1表示支持，
                                          //bySupport & 0x1, 表示是否支持智能搜索
                                          //bySupport & 0x2, 表示是否支持备份
                                          //bySupport & 0x4, 表示是否支持压缩参数能力获取
                                          //bySupport & 0x8, 表示是否支持多网卡
                                          //bySupport & 0x10, 表示支持远程SADP
                                          //bySupport & 0x20, 表示支持Raid卡功能
                                          //bySupport & 0x40, 表示支持IPSAN 目录查找
                                          //bySupport & 0x80, 表示支持rtp over rtsp*/
                                          /// <summary>
                                          /// 能力集扩充
                                          /// </summary>
            public byte bySupport1;        // 能力集扩充，位与结果为0表示不支持，1表示支持
                                           //bySupport1 & 0x1, 表示是否支持snmp v30
                                           //bySupport1 & 0x2, 支持区分回放和下载
                                           //bySupport1 & 0x4, 是否支持布防优先级	
                                           //bySupport1 & 0x8, 智能设备是否支持布防时间段扩展
                                           //bySupport1 & 0x10, 表示是否支持多磁盘数（超过33个）
                                           //bySupport1 & 0x20, 表示是否支持rtsp over http	
                                           //bySupport1 & 0x80, 表示是否支持车牌新报警信息2012-9-28, 且还表示是否支持NET_DVR_IPPARACFG_V40结构体
                                           /**/
                                           /// <summary>
                                           /// 能力
                                           /// </summary>
            public byte bySupport2; /*能力，位与结果为0表示不支持，非0表示支持							
							bySupport2 & 0x1, 表示解码器是否支持通过URL取流解码
							bySupport2 & 0x2,  表示支持FTPV40
							bySupport2 & 0x4,  表示支持ANR
							bySupport2 & 0x8,  表示支持CCD的通道参数配置
							bySupport2 & 0x10,  表示支持布防报警回传信息（仅支持抓拍机报警 新老报警结构）
							bySupport2 & 0x20,  表示是否支持单独获取设备状态子项
							bySupport2 & 0x40,  表示是否是码流加密设备*/
            /// <summary>
            /// 设备型号
            /// </summary>
            public ushort wDevType;              //设备型号
            public byte bySupport3; //能力集扩展，位与结果为0表示不支持，1表示支持
                                    //bySupport3 & 0x1, 表示是否多码流
                                    // bySupport3 & 0x4 表示支持按组配置， 具体包含 通道图像参数、报警输入参数、IP报警输入、输出接入参数、
                                    // 用户参数、设备工作状态、JPEG抓图、定时和时间抓图、硬盘盘组管理 
                                    //bySupport3 & 0x8为1 表示支持使用TCP预览、UDP预览、多播预览中的"延时预览"字段来请求延时预览（后续都将使用这种方式请求延时预览）。而当bySupport3 & 0x8为0时，将使用 "私有延时预览"协议。
                                    //bySupport3 & 0x10 表示支持"获取报警主机主要状态（V40）"。
                                    //bySupport3 & 0x20 表示是否支持通过DDNS域名解析取流
                                    /// <summary>
                                    /// 是否支持多码流
                                    /// </summary>
            public byte byMultiStreamProto;//是否支持多码流,按位表示,0-不支持,1-支持,bit1-码流3,bit2-码流4,bit7-主码流，bit-8子码流
            /// <summary>
            /// 起始数字通道号
            /// </summary>
            public byte byStartDChan;		//起始数字通道号,0表示无效
            /// <summary>
            /// 起始数字对讲通道号
            /// </summary>
            public byte byStartDTalkChan;	//起始数字对讲通道号，区别于模拟对讲通道号，0表示无效
            /// <summary>
            /// 数字通道个数
            /// </summary>
            public byte byHighDChanNum;		//数字通道个数，高位
            /// <summary>
            /// 
            /// </summary>
            public byte bySupport4;
            /// <summary>
            ///支持语种能力 
            /// </summary>
            public byte byLanguageType;// 支持语种能力,按位表示,每一位0-不支持,1-支持  
                                       //  byLanguageType 等于0 表示 老设备
                                       //  byLanguageType & 0x1表示支持中文
                                       //  byLanguageType & 0x2表示支持英文
                                       /// <summary>
                                       /// 保留
                                       /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 9, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes2;		//保留
        }
        /// <summary>
        /// DVR设备参数
        /// </summary>
        //DVR设备参数
        [StructLayoutAttribute(LayoutKind.Sequential)]
        public struct NET_DVR_DEVICECFG_V40
        {
            public uint dwSize;
            /// <summary>
            /// DVR名称
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = NAME_LEN, ArraySubType = UnmanagedType.I1)]
            public byte[] sDVRName; //DVR名称
            /// <summary>
            /// DVR ID,用于遥控器
            /// </summary>
            public uint dwDVRID;				//DVR ID,用于遥控器 //V1.4(0-99), V1.5(0-255)
            /// <summary>
            /// 是否循环录像
            /// </summary>
            public uint dwRecycleRecord;		//是否循环录像,0:不是; 1:是
            //以下不可更改
            /// <summary>
            /// 序列号
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = SERIALNO_LEN, ArraySubType = UnmanagedType.I1)]
            public byte[] sSerialNumber; //序列号
            /// <summary>
            /// 软件版本号,高16位是主版本,低16位是次版本
            /// </summary>
            public uint dwSoftwareVersion;			//软件版本号,高16位是主版本,低16位是次版本
            /// <summary>
            /// 软件生成日期,0xYYYYMMDD
            /// </summary>
            public uint dwSoftwareBuildDate;			//软件生成日期,0xYYYYMMDD
            /// <summary>
            /// DSP软件版本,高16位是主版本,低16位是次版本
            /// </summary>
            public uint dwDSPSoftwareVersion;		    //DSP软件版本,高16位是主版本,低16位是次版本
            /// <summary>
            /// DSP软件生成日期,0xYYYYMMDD
            /// </summary>
            public uint dwDSPSoftwareBuildDate;		// DSP软件生成日期,0xYYYYMMDD
            /// <summary>
            /// 前面板版本,高16位是主版本,低16位是次版本
            /// </summary>
            public uint dwPanelVersion;				// 前面板版本,高16位是主版本,低16位是次版本
            /// <summary>
            /// 硬件版本,高16位是主版本,低16位是次版本
            /// </summary>
            public uint dwHardwareVersion;	// 硬件版本,高16位是主版本,低16位是次版本
            /// <summary>
            /// DVR报警输入个数
            /// </summary>
            public byte byAlarmInPortNum;		//DVR报警输入个数
            /// <summary>
            /// DVR报警输出个数
            /// </summary>
            public byte byAlarmOutPortNum;		//DVR报警输出个数
            /// <summary>
            /// 232串口个数
            /// </summary>
            public byte byRS232Num;			//DVR 232串口个数
            /// <summary>
            /// 485串口个数
            /// </summary>
            public byte byRS485Num;			//DVR 485串口个数 
            /// <summary>
            /// 网络口个数
            /// </summary>
            public byte byNetworkPortNum;		//网络口个数
            /// <summary>
            /// 硬盘控制器个数
            /// </summary>
            public byte byDiskCtrlNum;			//DVR 硬盘控制器个数
            /// <summary>
            /// 硬盘个数
            /// </summary>
            public byte byDiskNum;				//DVR 硬盘个数
            /// <summary>
            /// DVR类型
            /// </summary>
            public byte byDVRType;				//DVR类型, 1:DVR 2:ATM DVR 3:DVS ......
            /// <summary>
            /// DVR 通道个数
            /// </summary>
            public byte byChanNum;				//DVR 通道个数
            /// <summary>
            /// 起始通道号
            /// </summary>
            public byte byStartChan;			//起始通道号,例如DVS-1,DVR - 1
            /// <summary>
            /// DVR 解码路数
            /// </summary>
            public byte byDecordChans;			//DVR 解码路数
            /// <summary>
            /// VGA口的个数
            /// </summary>
            public byte byVGANum;				//VGA口的个数 
            /// <summary>
            /// USB口的个数
            /// </summary>
            public byte byUSBNum;				//USB口的个数
            /// <summary>
            /// 辅口的个数
            /// </summary>
            public byte byAuxoutNum;			//辅口的个数
            /// <summary>
            /// 语音口的个数
            /// </summary>
            public byte byAudioNum;			//语音口的个数
            /// <summary>
            /// 最大数字通道数
            /// </summary>
            public byte byIPChanNum;			//最大数字通道数 低8位，高8位见byHighIPChanNum 
            /// <summary>
            /// 零通道编码个数
            /// </summary>
            public byte byZeroChanNum;			//零通道编码个数
            /// <summary>
            /// 能力
            /// </summary>
            public byte bySupport;        //能力，位与结果为0表示不支持，1表示支持，
                                          //bySupport & 0x1, 表示是否支持智能搜索
                                          //bySupport & 0x2, 表示是否支持备份
                                          //bySupport & 0x4, 表示是否支持压缩参数能力获取
                                          //bySupport & 0x8, 表示是否支持多网卡
                                          //bySupport & 0x10, 表示支持远程SADP
                                          //bySupport & 0x20, 表示支持Raid卡功能
                                          //bySupport & 0x40, 表示支持IPSAN搜索
                                          //bySupport & 0x80, 表示支持rtp over rtsp

            public byte byEsataUseage;		//Esata的默认用途，0-默认备份，1-默认录像
            /// <summary>
            /// 关闭即插即用
            /// </summary>
            public byte byIPCPlug;			//0-关闭即插即用，1-打开即插即用
            /// <summary>
            /// 
            /// </summary>
            public byte byStorageMode;		//0-盘组模式,1-磁盘配额, 2抽帧模式
            /// <summary>
            /// 能力
            /// </summary>
            public byte bySupport1;     //能力，位与结果为0表示不支持，1表示支持
                                        //bySupport1 & 0x1, 表示是否支持snmp v30
                                        //bySupport1 & 0x2, 支持区分回放和下载
                                        //bySupport1 & 0x4, 是否支持布防优先级	
                                        //bySupport1 & 0x8, 智能设备是否支持布防时间段扩展
                                        //bySupport1 & 0x10, 表示是否支持多磁盘数（超过33个）
                                        //bySupport1 & 0x20, 表示是否支持rtsp over http	
            public ushort wDevType;//设备型号
            /// <summary>
            /// 设备型号名称
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = DEV_TYPE_NAME_LEN, ArraySubType = UnmanagedType.I1)]
            public byte[] byDevTypeName;//设备型号名称 
            /// <summary>
            /// 能力集扩展
            /// </summary>
            public byte bySupport2; //能力集扩展，位与结果为0表示不支持，1表示支持
                                    //bySupport2 & 0x1, 表示是否支持扩展的OSD字符叠加(终端和抓拍机扩展区分)
            public byte byAnalogAlarmInPortNum; //模拟报警输入个数
            /// <summary>
            /// 模拟报警输入起始号
            /// </summary>
            public byte byStartAlarmInNo;    //模拟报警输入起始号
            /// <summary>
            /// 模拟报警输出起始号
            /// </summary>
            public byte byStartAlarmOutNo;  //模拟报警输出起始号
            /// <summary>
            /// IP报警输入起始号
            /// </summary>
            public byte byStartIPAlarmInNo;  //IP报警输入起始号  0-无效
            /// <summary>
            /// IP报警输出起始号
            /// </summary>
            public byte byStartIPAlarmOutNo; //IP报警输出起始号 0-无效
            /// <summary>
            /// 数字通道个数
            /// </summary>
            public byte byHighIPChanNum;     //数字通道个数，高8位 
            /// <summary>
            /// 保留
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 9, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes2;			//保留
        }
        /// <summary>
        /// 网络数据结构
        /// </summary>
        /*网络数据结构(子结构)(9000扩展)*/
        [StructLayoutAttribute(LayoutKind.Sequential)]
        public struct NET_DVR_ETHERNET_V30
        {
            /// <summary>
            /// DVR IP地址
            /// </summary>
            public NET_DVR_IPADDR struDVRIP;//DVR IP地址
            /// <summary>
            /// DVR IP地址掩码
            /// </summary>
            public NET_DVR_IPADDR struDVRIPMask;//DVR IP地址掩码
            /// <summary>
            /// 网络接口：1-10MBase-T；2-10MBase-T全双工；3-100MBase-TX；4-100M全双工；5-10M/100M/1000M自适应；6-1000M全双工
            /// </summary>
            public uint dwNetInterface;//网络接口：1-10MBase-T；2-10MBase-T全双工；3-100MBase-TX；4-100M全双工；5-10M/100M/1000M自适应；6-1000M全双工
            /// <summary>
            /// 端口号
            /// </summary>
            public ushort wDVRPort;//端口号
            /// <summary>
            /// 增加MTU设置，默认1500。
            /// </summary>
            public ushort wMTU;//增加MTU设置，默认1500。
            /// <summary>
            /// 物理地址
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MACADDR_LEN, ArraySubType = UnmanagedType.I1)]
            public byte[] byMACAddr;// 物理地址
            /// <summary>
            /// 
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 2, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes;
        }
        /// <summary>
        /// 网络数据结构
        /// </summary>
        /*网络数据结构(子结构)*/
        [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public struct NET_DVR_ETHERNET
        {
            /// <summary>
            /// DVR IP地址
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 16)]
            public string sDVRIP;//DVR IP地址
            /// <summary>
            /// DVR IP地址掩码
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 16)]
            public string sDVRIPMask;//DVR IP地址掩码
            /// <summary>
            /// 网络接口 1-10MBase-T 2-10MBase-T全双工 3-100MBase-TX 4-100M全双工 5-10M/100M自适应
            /// </summary>
            public uint dwNetInterface;//网络接口 1-10MBase-T 2-10MBase-T全双工 3-100MBase-TX 4-100M全双工 5-10M/100M自适应
            /// <summary>
            /// 端口号
            /// </summary>
            public ushort wDVRPort;//端口号
            /// <summary>
            /// 服务器的物理地址
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MACADDR_LEN, ArraySubType = UnmanagedType.I1)]
            public byte[] byMACAddr;//服务器的物理地址
        }
        /// <summary>
        /// pppoe结构
        /// </summary>
        //pppoe结构
        [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public struct NET_DVR_PPPOECFG
        {
            /// <summary>
            /// 0-不启用,1-启用
            /// </summary>
            public uint dwPPPOE;//0-不启用,1-启用
            /// <summary>
            /// /PPPoE用户名
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = NAME_LEN, ArraySubType = UnmanagedType.I1)]
            public byte[] sPPPoEUser;//PPPoE用户名
            /// <summary>
            /// PPPoE密码
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = PASSWD_LEN)]
            public string sPPPoEPassword;// PPPoE密码
            /// <summary>
            /// PPPoE IP地址
            /// </summary>
            public NET_DVR_IPADDR struPPPoEIP;//PPPoE IP地址
        }
        //网络配置结构(9000扩展)
        [StructLayoutAttribute(LayoutKind.Sequential)]
        public struct NET_DVR_NETCFG_V30
        {
            /// <summary>
            /// 
            /// </summary>
            public uint dwSize;
            /// <summary>
            /// 以太网口
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_ETHERNET, ArraySubType = UnmanagedType.Struct)]
            public NET_DVR_ETHERNET_V30[] struEtherNet;//以太网口
            /// <summary>
            /// 
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 2, ArraySubType = UnmanagedType.Struct)]
            public NET_DVR_IPADDR[] struRes1;/*保留*/
            /// <summary>
            /// 报警主机IP地址
            /// </summary>
            public NET_DVR_IPADDR struAlarmHostIpAddr;/* 报警主机IP地址 */
            /// <summary>
            /// 
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes2;
            public ushort wAlarmHostIpPort;
            public byte byUseDhcp;
            public byte byRes3;
            /// <summary>
            /// 域名服务器1的IP地址
            /// </summary>
            public NET_DVR_IPADDR struDnsServer1IpAddr;/* 域名服务器1的IP地址 */
            /// <summary>
            /// 域名服务器2的IP地址
            /// </summary>
            public NET_DVR_IPADDR struDnsServer2IpAddr;/* 域名服务器2的IP地址 */
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_DOMAIN_NAME, ArraySubType = UnmanagedType.I1)]
            public byte[] byIpResolver;
            public ushort wIpResolverPort;
            public ushort wHttpPortNo;
            /// <summary>
            /// 多播组地址
            /// </summary>
            public NET_DVR_IPADDR struMulticastIpAddr;/* 多播组地址 */
            /// <summary>
            /// 网关地址
            /// </summary>
            public NET_DVR_IPADDR struGatewayIpAddr;/* 网关地址 */
            /// <summary>
            /// 
            /// </summary>
            public NET_DVR_PPPOECFG struPPPoE;
            /// <summary>
            /// 
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 64, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes;
        }

        /*********************************************************
        Function:	NET_DVR_Login_V30
        Desc:		
        Input:	sDVRIP [in] 设备IP地址 
                wServerPort [in] 设备端口号 
                sUserName [in] 登录的用户名 
                sPassword [in] 用户密码 
        Output:	lpDeviceInfo [out] 设备信息 
        Return:	-1表示失败，其他值表示返回的用户ID值
        **********************************************************/
        /// <summary>
        /// 登录
        /// </summary>
        /// <param name="sDVRIP"></param>
        /// <param name="wDVRPort"></param>
        /// <param name="sUserName"></param>
        /// <param name="sPassword"></param>
        /// <param name="lpDeviceInfo"></param>
        /// <returns></returns>
        [DllImport(@"HCNetSDK.dll")]
        public static extern Int32 NET_DVR_Login_V30(string sDVRIP, Int32 wDVRPort, string sUserName, string sPassword, ref NET_DVR_DEVICEINFO_V30 lpDeviceInfo);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="lUserID"></param>
        /// <param name="dwCommand"></param>
        /// <param name="lChannel"></param>
        /// <param name="lpOutBuffer"></param>
        /// <param name="dwOutBufferSize"></param>
        /// <param name="lpBytesReturned"></param>
        /// <returns></returns>
        //参数配置 begin
        [DllImport(@"HCNetSDK.dll")]
        public static extern bool NET_DVR_GetDVRConfig(int lUserID, uint dwCommand, int lChannel, IntPtr lpOutBuffer, uint dwOutBufferSize, ref uint lpBytesReturned);
        /// <summary>
        /// 设置参数
        /// </summary>
        /// <param name="lUserID"></param>
        /// <param name="dwCommand"></param>
        /// <param name="lChannel"></param>
        /// <param name="lpInBuffer"></param>
        /// <param name="dwInBufferSize"></param>
        /// <returns></returns>
        [DllImport(@"HCNetSDK.dll")]
        public static extern bool NET_DVR_SetDVRConfig(int lUserID, uint dwCommand, int lChannel, System.IntPtr lpInBuffer, uint dwInBufferSize);

        /// <summary>
        /// IP地址
        /// </summary>
        /*IP地址*/
        [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public struct NET_DVR_IPADDR
        {

            /// char[16]
            [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 16)]
            public string sIpV4;

            /// BYTE[128]
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 128, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes;

            public void Init()
            {
                byRes = new byte[128];
            }
        }
        /// <summary>
        /// ipc接入设备信息扩展
        /// </summary>
        //ipc接入设备信息扩展，支持ip设备的域名添加
        [StructLayoutAttribute(LayoutKind.Sequential)]
        public struct NET_DVR_IPDEVINFO_V31
        {
            /// <summary>
            /// 该IP设备是否有效
            /// </summary>
            public byte byEnable;//该IP设备是否有效
            /// <summary>
            /// 
            /// </summary>
            public byte byProType;
            /// <summary>
            /// 
            /// </summary>
            public byte byEnableQuickAdd;
            /// <summary>
            /// 保留字段
            /// </summary>
            public byte byRes1;//保留字段，置0
            /// <summary>
            /// 用户名
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = NAME_LEN)]

            public string sUserName;//用户名
            /// <summary>
            /// 密码
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = PASSWD_LEN)]
            public string sPassword;//密码
            /// <summary>
            /// 设备域名
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = MAX_DOMAIN_NAME)]
            public string byDomain;//设备域名
            /// <summary>
            /// IP地址
            /// </summary>
            public NET_DVR_IPADDR struIP;//IP地址
            /// <summary>
            /// 端口号
            /// </summary>
            public ushort wDVRPort;// 端口号
            /// <summary>
            /// 保留字段
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 34, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes2;//保留字段，置0
        }
        /// <summary>
        /// 数据流
        /// </summary>
        [StructLayout(LayoutKind.Explicit)]
        public struct NET_DVR_GET_STREAM_UNION
        {
            [FieldOffset(0)]
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 492, ArraySubType = UnmanagedType.I1)]
            public byte[] byUnion;
            public void Init()
            {
                byUnion = new byte[492];
            }
        }
        /// <summary>
        /// 内容数据流模式
        /// </summary>
        [StructLayoutAttribute(LayoutKind.Sequential)]
        public struct NET_DVR_STREAM_MODE
        {
            /// <summary>
            /// 取流方式：0- 直接从设备取流；1- 从流媒体取流；2- 通过IPServer获得IP地址后取流；
            /// 3- 通过IPServer找到设备，再通过流媒体取设备的流； 4- 通过流媒体由URL去取流；
            /// 5- 通过hiDDNS域名连接设备然后从设备取流 
            /// </summary>
            public byte byGetStreamType;/*取流方式：0- 直接从设备取流；1- 从流媒体取流；2- 通过IPServer获得IP地址后取流；
                                          * 3- 通过IPServer找到设备，再通过流媒体取设备的流； 4- 通过流媒体由URL去取流；
                                          * 5- 通过hiDDNS域名连接设备然后从设备取流 */
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 3, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes;
            /// <summary>
            /// 
            /// </summary>
            public NET_DVR_GET_STREAM_UNION uGetStream;
            public void Init()
            {
                byGetStreamType = 0;
                byRes = new byte[3];
                //uGetStream.Init();
            }
        }
        /* V40扩展IP接入配置结构 */
        /// <summary>
        /// V40扩展IP接入配置结构
        /// </summary>
        [StructLayoutAttribute(LayoutKind.Sequential)]
        public struct NET_DVR_IPPARACFG_V40
        {
            /// <summary>
            /// 结构大小
            /// </summary>
            public uint dwSize;/* 结构大小 */
            public uint dwGroupNum;
            public uint dwAChanNum;
            public uint dwDChanNum;
            public uint dwStartDChan;
            /// <summary>
            /// 模拟通道是否启用，从低到高表示1-32通道，0表示无效 1有效
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_CHANNUM_V30, ArraySubType = UnmanagedType.I1)]
            public byte[] byAnalogChanEnable; /* 模拟通道是否启用，从低到高表示1-32通道，0表示无效 1有效 */
            /// <summary>
            /// IP设备
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_IP_DEVICE_V40, ArraySubType = UnmanagedType.Struct)]
            public NET_DVR_IPDEVINFO_V31[] struIPDevInfo; /* IP设备 */
            /// <summary>
            /// IP通道
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_CHANNUM_V30, ArraySubType = UnmanagedType.Struct)]
            public NET_DVR_STREAM_MODE[] struStreamMode;/* IP通道 */
            /// <summary>
            /// 模拟通道是否启用，从低到高表示1-32通道，0表示无效 1有效
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 20, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes2; /* 模拟通道是否启用，从低到高表示1-32通道，0表示无效 1有效 */
        }

        /* IP通道匹配参数 */
        /// <summary>
        /// IP通道匹配参数
        /// </summary>
        [StructLayoutAttribute(LayoutKind.Sequential)]
        public struct NET_DVR_IPCHANINFO
        {
            /// <summary>
            /// 该通道是否在线
            /// </summary>
            public byte byEnable;/* 该通道是否在线 */
            /// <summary>
            /// IP设备ID 取值1- MAX_IP_DEVICE 
            /// </summary>
            public byte byIPID;/* IP设备ID 取值1- MAX_IP_DEVICE */
            /// <summary>
            /// 通道号
            /// </summary>
            public byte byChannel;/* 通道号 */
            /// <summary>
            /// IP设备ID的高8位
            /// </summary>
            public byte byIPIDHigh; // IP设备ID的高8位
            /// <summary>
            /// 传输协议类型 0-TCP/auto(具体有设备决定)，1-UDP 2-多播 3-仅TCP 4-auto
            /// </summary>
            public byte byTransProtocol;//传输协议类型0-TCP/auto(具体有设备决定)，1-UDP 2-多播 3-仅TCP 4-auto
            /// <summary>
            /// 保留
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 31, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes;//保留,置0
            public void Init()
            {
                byRes = new byte[31];
            }
        }
        /// <summary>
        /// 
        /// </summary>
        [StructLayoutAttribute(LayoutKind.Sequential)]
        public struct NET_DVR_PU_STREAM_URL
        {
            public byte byEnable;
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 240, ArraySubType = UnmanagedType.I1)]
            public byte[] strURL;
            public byte byTransPortocol;
            public ushort wIPID;
            public byte byChannel;
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 7, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes;
            public void Init()
            {
                strURL = new byte[240];
                byRes = new byte[7];
            }
        }

        /// <summary>
        /// IP通道匹配参数
        /// </summary>
        [StructLayoutAttribute(LayoutKind.Sequential)]
        public struct NET_DVR_IPCHANINFO_V40
        {
            /// <summary>
            /// 该通道是否在线
            /// </summary>
            public byte byEnable;				/* 该通道是否在线 */
            /// <summary>
            /// 
            /// </summary>
            public byte byRes1;
            /// <summary>
            /// IP设备ID
            /// </summary>
            public ushort wIPID;                  //IP设备ID
            /// <summary>
            /// 通道号
            /// </summary>
            public uint dwChannel;				//通道号
            /// <summary>
            /// 0－主码流 1－子码流
            /// </summary>
            public byte byTransProtocol;		//传输协议类型0-TCP，1-UDP
            /// <summary>
            /// 传输码流模式 0－主码流 1－子码流
            /// </summary>
            public byte byTransMode;			//传输码流模式 0－主码流 1－子码流
            /// <summary>
            /// 前端设备厂家类型
            /// </summary>
            public byte byFactoryType;			/*前端设备厂家类型,通过接口获取*/
            /// <summary>
            /// 
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 241, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes;
        }
        /// <summary>
        /// 协议最大个数
        /// </summary>
        public const int IPC_PROTOCOL_NUM = 50;  //ipc 协议最大个数
        /// <summary>
        /// 云台描述字符串长度
        /// </summary>
        public const int DESC_LEN = 16;// 云台描述字符串长度 
        /// <summary>
        /// 协议类型
        /// </summary>//协议类型
        [StructLayoutAttribute(LayoutKind.Sequential)]
        public struct NET_DVR_PROTO_TYPE
        {
            /// <summary>
            /// ipc协议值
            /// </summary>
            public uint dwType;               /*ipc协议值*/
            /// <summary>
            /// 协议描述字段
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = DESC_LEN)]
            public string byDescribe; /*协议描述字段*/
        }
        /// <summary>
        /// 协议列表
        /// </summary>
        //协议列表
        [StructLayoutAttribute(LayoutKind.Sequential)]
        public struct NET_DVR_IPC_PROTO_LIST
        {
            /// <summary>
            /// 
            /// </summary>
            public uint dwSize;
            /// <summary>
            /// 有效的ipc协议数目
            /// </summary>
            public uint dwProtoNum;           /*有效的ipc协议数目*/
            /// <summary>
            /// 有效的ipc协议
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = IPC_PROTOCOL_NUM, ArraySubType = UnmanagedType.Struct)]
            public NET_DVR_PROTO_TYPE[] struProto;   /*有效的ipc协议*/
            /// <summary>
            /// 
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 8, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes;
        }
        /// <summary>
        /// 获取设备支持的IPC协议表
        /// </summary>
        /// <param name="lUserID"></param>
        /// <param name="lpProtoList"></param>
        /// <returns></returns>
        //获取设备支持的IPC协议表
        [DllImport(@"HCNetSDK.dll")]
        public static extern bool NET_DVR_GetIPCProtoList(int lUserID, ref NET_DVR_IPC_PROTO_LIST lpProtoList);
        /// <summary>
        /// 
        /// </summary>
        /// <param name="iUserID"></param>
        /// <returns></returns>
        [DllImport(@"HCNetSDK.dll")]
        public static extern bool NET_DVR_Logout(int iUserID);
        /*********************************************************
        Function:	NET_DVR_Cleanup
        Desc:		释放SDK资源，在结束之前最后调用
        Input:	
        Output:	
        Return:	TRUE表示成功，FALSE表示失败
        **********************************************************/
        /// <summary>
        /// 释放SDK资源，在结束之前最后调用
        /// </summary>
        /// <returns>TRUE表示成功，FALSE表示失败</returns>
        [DllImport(@"HCNetSDK.dll")]
        public static extern bool NET_DVR_Cleanup();
        #endregion
        

        #region 预览
        /********************预览回调函数*********************/
        /// <summary>
        /// 系统头数据
        /// </summary>
        public const int NET_DVR_SYSHEAD = 1;//系统头数据
        /// <summary>
        /// 视频流数据
        /// </summary>
        public const int NET_DVR_STREAMDATA = 2;//视频流数据（包括复合流和音视频分开的视频流数据）
        /// <summary>
        /// 音频流数据
        /// </summary>
        public const int NET_DVR_AUDIOSTREAMDATA = 3;//音频流数据
        /// <summary>
        /// 标准视频流数据
        /// </summary>
        public const int NET_DVR_STD_VIDEODATA = 4;//标准视频流数据
        /// <summary>
        /// 标准音频流数据
        /// </summary>
        public const int NET_DVR_STD_AUDIODATA = 5;//标准音频流数据

        /// <summary>
        /// 预览V40接口
        /// </summary>
        //预览V40接口
        [StructLayoutAttribute(LayoutKind.Sequential)]
        public struct NET_DVR_PREVIEWINFO
        {
            /// <summary>
            /// 通道号
            /// </summary>
            public Int32 lChannel;//通道号
            /// <summary>
            /// 码流类型
            /// </summary>
            public uint dwStreamType;	// 码流类型，0-主码流，1-子码流，2-码流3，3-码流4 等以此类推
            /// <summary>
            /// 连接方式：0- TCP方式，1- UDP方式，2- 多播方式，3- RTP方式，4-RTP/RTSP，5-RSTP/HTTP
            /// </summary>
            public uint dwLinkMode;// 0：TCP方式,1：UDP方式,2：多播方式,3 - RTP方式，4-RTP/RTSP,5-RSTP/HTTP 
            /// <summary>
            /// 播放窗口的句柄
            /// </summary>
            public IntPtr hPlayWnd;//播放窗口的句柄,为NULL表示不播放图象
            /// <summary>
            /// 0-非阻塞取流, 1-阻塞取流, 如果阻塞SDK内部connect失败将会有5s的超时才能够返回,不适合于轮询取流操作.
            /// </summary>
            public bool bBlocked;  //0-非阻塞取流, 1-阻塞取流, 如果阻塞SDK内部connect失败将会有5s的超时才能够返回,不适合于轮询取流操作.
            /// <summary>
            /// 0-不启用录像回传,1启用录像回传
            /// </summary>
            public bool bPassbackRecord; //0-不启用录像回传,1启用录像回传
            /// <summary>
            /// 预览模式
            /// </summary>
            public byte byPreviewMode;//预览模式，0-正常预览，1-延迟预览
            /// <summary>
            /// 流ID
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = STREAM_ID_LEN, ArraySubType = UnmanagedType.I1)]
            public byte[] byStreamID;//流ID，lChannel为0xffffffff时启用此参数
            /// <summary>
            /// 应用层取流协议
            /// </summary>
            public byte byProtoType; //应用层取流协议，0-私有协议，1-RTSP协议
            /// <summary>
            /// 
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 2, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes1;
            /// <summary>
            /// 
            /// </summary>
            public uint dwDisplayBufNum;
            /// <summary>
            /// 
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 216, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes;
        }
        /*********************************************************
		Function:	REALDATACALLBACK
		Desc:		预览回调
		Input:	lRealHandle 当前的预览句柄 
				dwDataType 数据类型
				pBuffer 存放数据的缓冲区指针 
				dwBufSize 缓冲区大小 
				pUser 用户数据 
		Output:	
		Return:	void
		**********************************************************/
        /// <summary>
        /// 预览回调
        /// </summary>
        /// <param name="lRealHandle"></param>
        /// <param name="dwDataType"></param>
        /// <param name="pBuffer"></param>
        /// <param name="dwBufSize"></param>
        /// <param name="pUser"></param>
        public delegate void REALDATACALLBACK(Int32 lRealHandle, UInt32 dwDataType, IntPtr pBuffer, UInt32 dwBufSize, IntPtr pUser);

        /*********************************************************
       Function:	NET_DVR_RealPlay_V40
       Desc:		实时预览扩展接口。
       Input:	lUserID [in] NET_DVR_Login()或NET_DVR_Login_V30()的返回值 
               lpPreviewInfo [in] 预览参数 
               fRealDataCallBack_V30 [in] 码流数据回调函数 
               pUser [in] 用户数据 
       Output:	
       Return:	1表示失败，其他值作为NET_DVR_StopRealPlay等函数的句柄参数
       **********************************************************/
        /// <summary>
        /// 实时预览扩展接口
        /// </summary>
        /// <param name="iUserID"></param>
        /// <param name="lpPreviewInfo"></param>
        /// <param name="fRealDataCallBack_V30"></param>
        /// <param name="pUser"></param>
        /// <returns></returns>
        [DllImport(@"HCNetSDK.dll")]
        public static extern int NET_DVR_RealPlay_V40(int iUserID, ref NET_DVR_PREVIEWINFO lpPreviewInfo, REALDATACALLBACK fRealDataCallBack_V30, IntPtr pUser);

        /*********************************************************
		Function:	NET_DVR_StopRealPlay
		Desc:		停止预览。
		Input:	lRealHandle [in] 预览句柄，NET_DVR_RealPlay或者NET_DVR_RealPlay_V30的返回值 
		Output:	
		Return:	
		**********************************************************/
        /// <summary>
        /// 停止预览
        /// </summary>
        /// <param name="iRealHandle"></param>
        /// <returns></returns>
        [DllImport(@"HCNetSDK.dll")]
        public static extern bool NET_DVR_StopRealPlay(int iRealHandle);
        #endregion

        #region 抓图
        /// <summary>
        /// 图片质量
        /// </summary>
        //图片质量
        [StructLayoutAttribute(LayoutKind.Sequential)]
        public struct NET_DVR_JPEGPARA
        {
            /*注意：当图像压缩分辨率为VGA时，支持0=CIF, 1=QCIF, 2=D1抓图，
	        当分辨率为3=UXGA(1600x1200), 4=SVGA(800x600), 5=HD720p(1280x720),6=VGA,7=XVGA, 8=HD900p
	        仅支持当前分辨率的抓图*/
            /// <summary>
            /// 0=CIF, 1=QCIF, 2=D1 3=UXGA(1600x1200), 4=SVGA(800x600), 5=HD720p(1280x720),6=VGA
            /// </summary>
            public ushort wPicSize;/* 0=CIF, 1=QCIF, 2=D1 3=UXGA(1600x1200), 4=SVGA(800x600), 5=HD720p(1280x720),6=VGA*/
            /// <summary>
            /// 图片质量系数 0-最好 1-较好 2-一般
            /// </summary>
            public ushort wPicQuality;/* 图片质量系数 0-最好 1-较好 2-一般 */
        }
        [DllImport(@"HCNetSDK.dll")]
        public static extern bool NET_DVR_CapturePicture(Int32 lRealHandle, string sPicFileName);
        /// <summary>
        /// 
        /// </summary>
        /// <param name="lUserID"></param>
        /// <param name="lChannel"></param>
        /// <param name="lpJpegPara"></param>
        /// <param name="sPicFileName"></param>
        /// <returns></returns>
        //2005-09-15
        [DllImport(@"HCNetSDK.dll")]
        public static extern bool NET_DVR_CaptureJPEGPicture(int lUserID, int lChannel, ref NET_DVR_JPEGPARA lpJpegPara, string sPicFileName);
        /// <summary>
        /// 
        /// </summary>
        /// <param name="lUserID"></param>
        /// <param name="lChannel"></param>
        /// <param name="lpJpegPara"></param>
        /// <param name="sJpegPicBuffer"></param>
        /// <param name="dwPicSize"></param>
        /// <param name="lpSizeReturned"></param>
        /// <returns></returns>
        //JPEG抓图到内存
        [DllImport(@"HCNetSDK.dll")]
        public static extern bool NET_DVR_CaptureJPEGPicture_NEW(int lUserID, int lChannel, ref NET_DVR_JPEGPARA lpJpegPara, byte[] sJpegPicBuffer, uint dwPicSize, ref uint lpSizeReturned);

        #endregion

        #region 录像
        /// <summary>
        /// 动态生成I帧-主码流
        /// </summary>
        /// <param name="lUserID"></param>
        /// <param name="lChannel"></param>
        /// <returns></returns>
        //动态生成I帧
        [DllImport(@"HCNetSDK.dll")]
        public static extern bool NET_DVR_MakeKeyFrame(Int32 lUserID, Int32 lChannel);//主码流
        /// <summary>
        /// 子码流
        /// </summary>
        /// <param name="lUserID"></param>
        /// <param name="lChannel"></param>
        /// <returns></returns>
        [DllImport(@"HCNetSDK.dll")]
        public static extern bool NET_DVR_MakeKeyFrameSub(Int32 lUserID, Int32 lChannel);//子码流

        /// <summary>
        /// 读取并保存数据
        /// </summary>
        /// <param name="lRealHandle"></param>
        /// <param name="sFileName"></param>
        /// <returns></returns>
        [DllImport(@"HCNetSDK.dll")]
        public static extern bool NET_DVR_SaveRealData(Int32 lRealHandle, string sFileName);
        /// <summary>
        /// 停止读取并保存数据
        /// </summary>
        /// <param name="lRealHandle"></param>
        /// <returns></returns>
        [DllImport(@"HCNetSDK.dll")]
        public static extern bool NET_DVR_StopSaveRealData(Int32 lRealHandle);
        #endregion

        /// <summary>
        /// 启用日志文件写入接口
        /// </summary>
        /// <param name="bLogEnable"></param>
        /// <param name="strLogDir"></param>
        /// <param name="bAutoDel"></param>
        /// <returns></returns>
        //启用日志文件写入接口
        [DllImport(@"HCNetSDK.dll")]
        public static extern bool NET_DVR_SetLogToFile(int bLogEnable, string strLogDir, bool bAutoDel);

        /// <summary>
        /// 获取最后错误日志
        /// </summary>
        /// <returns></returns>
        [DllImport(@"HCNetSDK.dll")]
        public static extern uint NET_DVR_GetLastError();
    }
}
